package com.alibaba.datax.plugin.writer.hiverdbmswriter;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * @author QF
 * @date 2024/6/20 8:38
 * @detail
 */
public class ConnectionPool {

    private static final Logger LOG = LoggerFactory.getLogger(ConnectionPool.class);

    public static ComboPooledDataSource getComboPool(String driverClass, String jdbcUrl, String user, String password) {
        // 创建ComboPooledDataSource实例
        ComboPooledDataSource dataSource = new ComboPooledDataSource();

        // 设置JDBC驱动
        try {
            dataSource.setDriverClass(driverClass);
        } catch (PropertyVetoException e) {
            LOG.info(e.getMessage());
        }

        // 设置数据库连接URL
        dataSource.setJdbcUrl(jdbcUrl);

        // 设置数据库用户名
        dataSource.setUser(user);

        // 设置数据库密码
        dataSource.setPassword(password);

        // 设置最大连接数
        dataSource.setMaxPoolSize(9);

        // 设置最小连接数
        dataSource.setMinPoolSize(3);

        // 设置初始化时获取的连接数
        dataSource.setInitialPoolSize(3);
        // 设置获取连接超时时间（秒）
        dataSource.setAcquireIncrement(3); // 每次增加的连接数
        dataSource.setAcquireRetryAttempts(5); // 获取连接重试次数
        dataSource.setAcquireRetryDelay(1000); // 获取连接重试等待时间（毫秒）

        // 设置连接超时时间（秒）
        dataSource.setMaxIdleTime(600); // 连接最大空闲时间

        // 设置连接测试语句
        dataSource.setPreferredTestQuery("SELECT 1");
        LOG.info("---------------------连接池初始化完成-------------------------");
        return dataSource;
    }

    public static Connection getConnection(String driverClass, String jdbcUrl, String user, String password){
        try {
            return getComboPool(driverClass, jdbcUrl, user, password).getConnection();
        } catch (SQLException e) {
            LOG.error(e.getMessage());
        }
        return null;
    }

}
